print(
    '#############map()函数接收两个参数，一个是函数，一个是Iterable，map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回。#############')
print(
    '#############比如我们有一个函数f(x)=x2，要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上，就可以用map()实现如下#############')


def fun1(x):
    return x * x


l = list(range(1, 11))
print(l)
r = map(fun1, l)
print('r', r)
print('list(r)', list(r))
print('list(r)', list(r))
print('#############将list中的数字转化为字符串，map只能被list()一次？#############')
print(list(map(str, l)))
print('r', r)
list2 = list(r)
print('list2', list2)
print(list(map(str, list(r))))
print('#############reduce的用法#############')
print(
    '#############reduce把一个函数作用在一个序列[x1, x2, x3, ...]上，这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算#############')
from functools import reduce


def add(x, y):
    return x + y


print('reduce:', reduce(add, [2, 4, 6, 8, 2]))


def add_two(x, y):
    return x * 10 + y


print('reduce:', reduce(add_two, [2, 4, 6, 8, 2]))
print('#############把str，\'135190\'转换为int的函数，配合使用map()函数#############')


def char_to_num(a):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    l = []
    for ch in a:
        l.append(digits.get(ch))
    result = reduce(add_two, l)
    return result


print(char_to_num("798746546"))


def charToNum_Two(a):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits.get(a)


print(reduce(add_two, list(map(charToNum_Two, "798746546"))))
print(reduce(add_two, map(charToNum_Two, "798746546")))
print('#############整理成一个str2int的函数就是#############')


def str2int(a):
    def addNum(x, y):
        return x * 10 + y

    def charToNum(a):
        digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
        return digits.get(a)

    return reduce(addNum, map(charToNum, a))


print(str2int("179176279"))
print('#############还可以用lambda函数进一步简化成#############')
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}


def char2num(s):
    return DIGITS[s]


def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))


print(str2int("868697987"))
print(
    '#############利用map()函数，把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。输入：[\'adam\', \'LISA\', \'barT\']，输出：[\'Adam\', \'Lisa\', \'Bart\']：#############')
names = ['adam', 'LISA', 'barT']


def upCase(a):
    tempstr = ''
    for i in list(range(len(a))):
        if i == 0:
            tempstr = tempstr + a[i].upper()
        else:
            tempstr = tempstr + a[i].lower()
    return tempstr


print(list(map(upCase, names)))
print(
    '#############Python提供的sum()函数可以接受一个list并求和，请编写一个prod()函数，可以接受一个list并利用reduce()求积#############')


def multify(x, y):
    return x * y


def prod(num):
    return reduce(multify, num)


numbers = [56, 44, 65, 35]
print(56 * 44 * 65 * 35)
print(prod(numbers))
print('#############利用map和reduce编写一个str2float函数，把字符串\'123.456\'转换成浮点数123.456#############')


def str2float(str):
    # 将字符串分割成按照.分割成list
    strlist = str.split('.')
    return reduce(add_num, list(map(str_float, strlist)))


# 将两个数相加
def add_num(x, y):
    return x + y


# 将str转化为float
def str_float(str):
    return float(str)


print(str2float('123.456'))
print(float('123.456'))
